Перейти к основному содержимому

Camera

Камера позволяет делать снимки экрана или даже отображать видео с мира на дисплее! Картинка с нашей камеры выглядит великолепно, даже не прибегая к трассировке лучей. Трассировки лучей не происходит! Просто лучи, идущие повсюду, как мультикаст!

Это даже не сложная математика! Просто сложение, вычитание, деление и умножение.

На заметочку

Камеры в ScrapComputers используют многоадресную рассылку для получения кадра или видео. Однако raycast в Scrap Mechanic, к которым у нас (моддеров) есть доступ, работает медленно. Это потому, что (если верить VeraDev) raycast обрабатывается процессором. Если бы это делала видеокарта, это не заняло бы много времени.

Чем больше разрешение, тем больше кадр. Тем больше времени потребуется, чтобы отправить все эти лучи. Вы можете посчитать, сколько лучей вы собираетесь использовать, просто используя простые математические вычисления. Формула для расчета: ширина*высота.

Нам нужно сделать многоадресную рассылку, поскольку другого способа сделать это нет. Итак, если вы собираетесь использовать камеру и ваша игра зависает при получении кадра/видео, значит, ваш процессор занят расчётами.


Структуры

PixelRayResult

Это либо исходный результат raycast пикселя, либо его модифицированная безопасная версия, если в конфигураторе включен безопасный режим скриптов. В режиме небезопасной среды вы будете получать результат raycastResult, пожалуйста, смотрите раздел raycastResult для получения дополнительной информации.

Если скрипт выполняется в безопасной среде, исходный результат игры raycastResult модифицируется, и важные данные возвращаются в виде таблицы:

{
directionWorld = raycastResult.directionWorld, -- Направление в мире
fraction = raycastResult.fraction , -- Доля
normalLocal = raycastResult.normalLocal , -- Относительная нормаль
normalWorld = raycastResult.normalWorld , -- Абсолютная нормаль
originWorld = raycastResult.originWorld , -- Абсолютная координата начала raycast
pointLocal = raycastResult.pointLocal , -- Относительная координата цели
pointWorld = raycastResult.pointWorld , -- Абсолютная координата цели
type = raycastResult.type , -- Тип
valid = raycastResult.valid , -- Корректность raycast
material = material , -- Материал земли, если raycast попал в неё
color = color -- Цвет цели (если он существует)
}

DrawerFunction

Функция отрисовки - это функция, которая получает оригинальный результат raycast'а и отрисовывает его на дисплее. С помощью неё вы можете изменить принцип отрисовки кадра.

Аргументы:

  • hit [ boolean ] Raycast попал куда-нибудь или нет.
  • raycastResult [ PixelRayResult ] Результат луча raycast'а.
  • x [ number ] X-координата текущего пикселя.
  • y [ number ] Y-координата текущего пикселя.

Функция отрисовки должна быть написана следующим образом:

local function DrawerFunction(hit, raycastResult, x, y)
--[[ваш код здесь]]

return color -- может быть sm.color или цветом в шестнадцатеричном формате
end

Пример функции отрисовки, который делает изображение, полученное с помощью функции depthFrame:

local function DrawerFunction(hit, raycastResult, x, y)
local color = sm.color.new(0, 0, 0)

if hit then
color = sm.color.new(1, 1, 1) * (1 - result.fraction)
end

return color
end

Функции

frame

Camera.frame( display, width, height )

Делает кадр (как скриншот)

Аргументы:

  • display [ Display ] Дисплей, на котором необходимо отрисовать кадр.
  • width [ integer? ] Ширина кадра (По умолчанию ширина дисплея).
  • height [ integer? ] Высота кадра (По умолчанию высота дисплея).

depthFrame

Camera.depthFrame( display, focalLength, width, height )

Делает карту глубины (как скриншот).

Аргументы:

  • display [ Display ] Дисплей, на котором необходимо отрисовать кадр.
  • focalLength [ integer ] Фокусное расстояние.
  • width [ integer? ] Ширина кадра (По умолчанию ширина дисплея).
  • height [ integer? ] Высота кадра (По умолчанию высота дисплея).

maskedFrame

Camera.maskedFrame( display, mask, width, height )

Делает снимок с фильтром на определённый тип результата Raycast.

В случае, если mask это string[]: Каждая строка представляет собой тип результата raycast. Если тип raycasts соответствует пикселю, он будет белым или черным. В случае, если mask это string: Если тип raycasts совпадает с маской, цвет пикселя будет белым, а в противном случае - черным.

Если вы не знаете, какие значения вы можете использовать, просто нажмите сюда.

Аргументы:

  • display [ Display ] Дисплей, на котором необходимо отрисовать кадр.
  • mask [ string|string[] ] Фильтр для raycast.
  • width [ integer? ] Ширина кадра (По умолчанию ширина дисплея).
  • height [ integer? ] Высота кадра (По умолчанию высота дисплея).

video

Camera.video( display, sliceWidth, width, height )

Похоже на frame, но в виде фрагментов, что означает, что вы могли бы создавать камеры видеонаблюдения без больших лагов! Просто частота обновления была бы ниже.

Аргументы::

  • display [ Display ] Дисплей, на котором необходимо отрисовать кадры.
  • width [ integer? ] Ширина кадра (По умолчанию ширина дисплея).
  • height [ integer? ] Высота кадра (По умолчанию высота дисплея).
  • sliceWidth [ integer ] Количество кадров, которая сделает камера за тик.

advancedFrame

Camera.advancedFrame( display, width, height )
По поводу производительности

Продвинутые функции используют Трассировку на CPU (через Raycasting), чтобы отрисовать ваш кадр(ы). Эта функция сильно нагружает ваш процессор!

Делает кадр (как скриншот)

Аргументы::

  • display [ Display ] Дисплей, на котором необходимо отрисовать кадры.
  • width [ integer? ] Ширина кадра (По умолчанию ширина дисплея).
  • height [ integer? ] Высота кадра (По умолчанию высота дисплея).

advancedVideo

Camera.advancedVideo( display, sliceWidth, width, height )
По поводу производительности

Продвинутые функции используют Трассировку на CPU (через Raycasting), чтобы отрисовать ваш кадр(ы). Эта функция сильно нагружает ваш процессор!

Похоже на advancedFrame, но в виде фрагментов, что означает, что вы могли бы создавать камеры видеонаблюдения без больших лагов! Просто частота обновления была бы ниже.

Аргументы::

  • display [ Display ] Дисплей, на котором необходимо отрисовать кадры.
  • width [ integer? ] Ширина кадра (По умолчанию ширина дисплея).
  • height [ integer? ] Высота кадра (По умолчанию высота дисплея).
  • sliceWidth [ integer ] Количество кадров, которая сделает камера за тик.

customFrame

Camera.customFrame( display, drawer, width, height )

Это функция, которая позволяет использовать свою функцию отрисовки.

Аргументы:

  • display [ Display ] Дисплей, на котором необходимо отрисовать кадр.
  • drawer [ DrawerFunction ] Функция отрисовки.
  • width [ integer? ] Ширина кадра (По умолчанию ширина дисплея).
  • height [ integer? ] Высота кадра (По умолчанию высота дисплея).

customVideo

Camera.customVideo( display, drawer, sliceWidth, width, height )

Это функция, которая позволяет использовать свою функцию отрисовки для видео.

Аргументы:

  • display [ Display ] Дисплей, на котором необходимо отрисовать кадр.
  • drawer [ DrawerFunction ] Функция отрисовки.
  • sliceWidth [ integer ] Количество кадров, которая сделает камера за тик.
  • width [ integer? ] Ширина кадра (По умолчанию ширина дисплея).
  • height [ integer? ] Высота кадра (По умолчанию высота дисплея).

setRange

Camera.setRange( int )

Устанавливает дистанцию дальности кадра.

Аргументы:

  • int [ integer ] Дальность в метрах.

setShadowRange

Camera.setShadowRange( int )
По поводу производительности

Чем это значение выше, тем лучше тени, которые вы можете получить, поскольку трассировка лучей позволяет отбрасывать тень с большего расстояния, но более длинные потоки лучей требуют больших вычислительных затрат.

Устанавливает дальность, до которой могут отрисовываться тени.

Аргументы:

  • int [ integer ] Дальность в метрах.

setFov

Camera.setFov( int )

Устанавливает FOV камеры.

Аргументы:

  • int [ integer ] FOV в градусах.

setOffsetX

Camera.setOffsetX( int )

Устанавливает смещение камеры по оси x, это число, которое добавляется к соответствующей координате при выводе камеры на дисплей в положении по умолчанию (1, 1).

Аргументы:

  • int [ integer ] Смещение по X.

setOffsetY

Camera.setOffsetY( int )

Устанавливает смещение камеры по оси y, это число, которое добавляется к соответствующей координате при выводе камеры на дисплей в положении по умолчанию (1, 1).

Аргументы:

  • int [ integer ] Смещение по Y.